package com.itbaizhan;

public class CookieAndHttpSession {
    /*Cookie对象与HttpSession对象的作用是维护客户端浏览器与服务端的会
    话状态的两个对象。由于HTTP协议是一个无状态的协议，所以服务端并不会记录
    当前客户端浏览器的访问状态，但是在有些时候我们是需要服务端能够记录
    客户端浏览器的访问状态的，如获取当前客户端浏览器的访问服务端的次数时就
    需要会话状态的维持。在Servlet中提供了Cookie对象与HttpSession对象
    用于维护客户端与服务端的会话状态的维持。二者不同的是Cookie是通过客户
    端浏览器实现会话的维持，而HttpSession是通过服务端来实现会话状态的维
    持。

实时效果反馈

1.Cookie对象与HttpSession对象的作用是。

A 维护客户端与服务端的会话状态

B 维护客户端与客户端的会话状态

C 维护服务端与服务端的会话状态

答案

1=>A*/

/*Cookie对象的特点
Cookie使用字符串存储数据
Cookie使用Key与Value结构存储数据
单个Cookie存储数据大小限制在4097个字节
Cookie存储的数据中不支持中文，Servlet4.0中支持
Cookie是与域名绑定所以不支持跨一级域名访问
Cookie对象保存在客户端浏览器内存或系统磁盘中
Cookie分为持久化Cooke与状态Cookie
浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同，Chrome浏览器为50个
浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端。*/

/*Cookie跨域问题  （一张会员卡，不支持不同的餐厅用，但支持同一餐厅下的分店使用）
域名分类：域名分为顶级域、顶级域名(一级域名)、二级域名。
域名等级的区别：一级域名比二级域名更高级，二级域名是依附于一级域名之下的附属分区域名，即二级域名是一级域名的细化分级。例如：baidu.com 为一级域名，news.baidu.com为二级域名。

Cookie不支持一级域名的跨域，支持二级域名的跨域。*/

/*    状态Cookie与持久化Cookie
    状态Cookie：Cookie对象仅会被缓存在浏览器所在的内存中。
    当浏览器关闭后Cookie对象 也会被销毁。

    持久化Cookie：浏览器会对Cookie做持久化处理，基于文件形式保存在系统
    的指定目录中。在Windows10系统中为了安全问题不会显示Cookie中的内容。

    当Cookie对象创建后默认为状态Cookie。可以使用Cookie对象下的cookie.
    setMaxAge(60)方法设置失效时间，单位为秒。一旦设置了失效时间，
    那么该Cookie为持久化Cookie，浏览器会将Cookie对象持久化到磁盘中。
    当失效时间到达后文件删除。

 */



/*HttpSession对象的特点
HttpSession保存在服务端
HttpSession使用Key与Value结构存储数据
HttpSession的Key是字符串类型，Value则是Object类型
HttpSession存储数据大小无限制
 */

    /*不同的浏览器创建不同的jsessionid,创建不同的jession对象
     * 当关闭浏览器时，HttpSession对象不会销毁，会缓存在HttpSession列表中，只是删除了cookie,再次启动浏览器
     * 时，会重新创建一个HttpSession对象*/

    /*HttpSession的销毁方式
HttpSession的销毁方式有两种：

通过web.xml文件指定超时时间
通过HttpSession对象中的invalidate()方法销毁当前HttpSession对象

我们可以在web.xml文件中指定HttpSession的超时时间，当到达指定的超时时间
后，容器就会销该HttpSession对象，单位为分钟。该时间对整个web项目中的
所有HttpSession对象有效。时间的计算方式是根据最后一次请求时间作为起始时间。
只要用户继续访问，服务器就会更新HttpSession的最后访问时间，
并维护该HttpSession。用户每访问服务器一次，无论是否读写HttpSession，
服务器都认为该用户的HttpSession"活跃（active）"了一次,
销毁时间则会重新计算。如果有哪个客户端浏览器对应的HttpSession的失效时间
已到，那么与该客户端浏览器对应的HttpSession对象就会被销毁。
其他客户端浏览器对应的HttpSession对象会继续保存不会被销毁。

1<session-config>
2    <session-timeout>1</session-timeout>
3</session-config>

我们也可以在Tomcat的web.xml文件中配置HttpSession的销毁时间。
如果在Tomcat的web.xml文件中配置了HttpSession的超时时间对应的是
Tomcat中所有的Web项目都有效。相当于配置了全局的HttpSession超时时间。
如果我们在Web项目中配置了超时时间，那么会以Web项目中的超时时间为准。
633<session-config>
634<session-timeout>1</session-timeout>
635</session-config>

invalidate()方法是HttpSession对象中所提供的用于销毁当前
HttpSession的方法。我们通过调用该方法可以销毁当前HttpSession对象。*/

/*HttpSession生命周期
在HttpSession对象生命周期中没有固定的创建时间与销毁时间。
何时创建取决于我们什么时候第一次调用了getSession()或getSession(true)的方法。
HttpSession对象的销毁时间取决于超时时间的到达以及调用了invalidate()方法。
如果没有超时或者没有调用invalidate()方法，那么HttpSession会一直存储。
默认超时时间为30分钟(Tomcat的web.xml文件配置的时间就是默认超时时间)。

实时效果反馈

1.HttpSession默认的超时时间是。

A 10分钟
B 20分钟
C 30分钟
D 40分钟

答案
1=>C
*/
}


/*HttpSession对象总结
HttpSession与Cookie的区别：

cookie数据存放在客户的浏览器或系统的文件中，而HttpSession中的数据存放在服务器中。
cookie不安全，而HttSession是安全的。
单个cookie保存的数据不能超过4K，很多浏览器都限制一个域名保存cookie的数量。
而HttpSession没有容量以及数量的限制。

HttpSession的使用建议

HttpSession对象是保存在服务端的，所以安全性较高。
我们可以在HttpSession对象中存储数据，但是由于HttpSession对象的生命
周期不固定，所以不建议存放业务数据。一般情况下我们只是存放用户登录信息。*/